//
//  main.c
//  Learning-C
//
//  Created by admin on 2019/7/5.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//

#include <stdio.h>

//注意：如果程序没有输出信息，下面的控制台输出区域不会自动弹出来
/*
 
 main 函数是程序的入口和出口。
 定义变量，本质是在内存上开辟存储数据的空间。
 
 int类型        能保存的为正负21亿范围内的整数数；
 printf(“%d\n”,INT32_MAX);
 float类型        精确保存位数为7位，超出的部分四舍五入；
 double类型     精确保存位数位16位，超出的部分四舍五入；
 char类型        只能保存单一字符。
 
 cc -c xxx.c 编译成二进制文件 -> 翻译成机器语言
 cc  xxx.o 链接二进制文件 -> 添加启动代码
 ./ xxx.out 运行程序
 
 
 cc xxx.c 直接编译并链接原文件
 
 
 printf(“%02d”,intNum);
 print(“%.2f”,floatNum);
 
 ASCII表
 ‘A’   65
 ‘a’    97
 ‘0’    48
 
 交换两个变量的值，并且不能使用第三方临时值
 口诀：两数相加再相减
 
 C 语言的数据类型
    1.基本数据类型 - int double float char
    2.构造类型 - 数组、结构体、枚举
    3.指针类型
    4.空类型 - void
    5.typedef自定义类型
 
 */

/*
 scanf函数的执行原理：
     1）scanf函数是阻塞式函数，当CPU执行到这个scanf函数的时候，CPU的执行就会暂停，并等待用户输入。
        1.数据输入完毕后，并不是将这个数据直接赋值给变量，
          而是先将数据存储在缓冲区，输入的任何数据都会存储在缓冲区，包括空格和回车；
        2.在执行scanf函数的时候，会检查缓冲区中是否有数据，
          如果缓冲区中没有数据，那么会让用户输入；
          如果缓冲区中有数据，直接从缓存区中将数据拿出来，不会让用户输入数据；
        3.当从缓冲区中拿数据的时候，
          如果要拿的数据的类型是整型或者实型，
          如果拿到的是空格或者回车，就会被自动忽略，继续往下取。
 
          如果要拿的数据的类型是字符型，不会忽略任何数据。会取到空格和回车，不然用户输入。
          所有为避免输入时错误，在输入前需要对缓存区进行清除。
 
          rewind(stdin);
 
 
     2）如果输入的数据类型不匹配，那么输入数据接收失败，变量的值为默认值。
     3）如果要求用户输入的数据是1个数（实型和整型）
        用户在输入数据之前，输入的空格、回车、tab键都会被自动忽略。
     4）scanf函数同时输入多个数据时，默认的分隔符是空格或者回车
        自定义分隔符：
        scanf("%d-%d-%d",&a,&b,%c);  //代表输入3个数据，这3个数据使用-分开
       注意：一旦使用了自定义分隔符，程序只能识别指定的分隔符，默认的空格和回车就失效了。
     5）如果使用scanf函数一次输入多个数据，只能是数（整型和浮点型），如果char混合输入，就会出问题。这里涉及到缓冲区的问题。
        如果要拿的数据的类型是字符型，不会忽略任何数据。会取到空格和回车，不然用户输入。
 
 */

//缓冲区的概率
void Buffer(void);

//交换两个变量的值，并且不适用第三方临时值
void ExchangeNumber(void);

int main(int argc, const char * argv[]) {
    

    ExchangeNumber();
    
    return 0;
}


//缓冲区的概念
void Buffer(){
    //为什么要给存储数据的变量赋值，因为scanf输入可能会失败。
    int num1 = 0, num2 = 0;
    
    printf("请输入第一个数:");
    scanf("%d",&num1);
    printf("num1 = %d \n",num1);
    
    //清空缓冲区全部数据
    rewind(stdin);
    
    printf("请输入第二个数:");
    scanf("%d",&num2);
    printf("num2 = %d\n",num2);
    
}

//交换两个变量的值
void ExchangeNumber(){
    
    int num1 = 110;
    int num2 = 200;
    
    printf("num1 = %d , num2 = %d\n",num1,num2);
    
    num1 = num1 + num2;
    num2 = num1 - num2;
    num1 = num1 - num2;
    
    printf("num1 = %d , num2 = %d\n",num1,num2);
    
}


